package com.linkgie.galaxyframework.keystore;

import java.util.Set;

import com.linkgie.galaxyframework.crypto.CryptoKeypair;
import com.linkgie.galaxyframework.crypto.MismatchedKeypairException;
import com.linkgie.galaxyframework.crypto.PrivateKey;
import com.linkgie.galaxyframework.crypto.PublicKey;
import com.linkgie.galaxyframework.utils.security.PasswordSupplier;

/**
 * 密钥仓库；
 * 
 * @author huanghaiquan
 *
 */
public interface Keystore {

	/**
	 * 返回所有别名；
	 * 
	 * @return
	 */
	Set<String> getKeyAlias();

	boolean containsKey(String alia);

	/**
	 * 返回公钥；
	 * 
	 * @param alia
	 * @return
	 */
	PublicKey getPubKey(String alia);

	/**
	 * 返回私钥；
	 * 
	 * @param alia
	 * @param password
	 * @return
	 */
	default PrivateKey getPrivKey(String alia) {
		return getPrivKey(alia, null);
	}

	/**
	 * 返回私钥；
	 * 
	 * @param alia
	 * @param password
	 * @return
	 */
	PrivateKey getPrivKey(String alia, PasswordSupplier passwordSupplier);

	/**
	 * 返回密钥对；
	 * <p>
	 * 
	 * 如果不存在，则返回 null；
	 * 
	 * @param alia
	 * @param password
	 * @return
	 */
	default CryptoKeypair getKeyPair(String alia) {
		return getKeyPair(alia, null);
	}

	/**
	 * 返回密钥对；
	 * <p>
	 * 
	 * 如果不存在，则返回 null；
	 * 
	 * @param alia
	 * @param password
	 * @return
	 */
	CryptoKeypair getKeyPair(String alia, PasswordSupplier passwordSupplier);

	/**
	 * 生成新的随机密钥，并保存至密钥库；
	 * 
	 * @param algorithm
	 * @return
	 */
	default CryptoKeypair generateAndAddKeyPair(String alia, String algorithm) {
		return generateAndAddKeyPair(alia, algorithm, null);
	}

	/**
	 * 生成新的随机密钥，并保存至密钥库；
	 * 
	 * @param algorithm
	 * @return
	 */
	CryptoKeypair generateAndAddKeyPair(String alia, String algorithm, PasswordSupplier passwordSupplier);

	/**
	 * 加入密钥；
	 * 
	 * @param algorithm
	 * @return
	 */
	default void addKeyPair(String alia, PublicKey pubKey, PrivateKey privKey) throws MismatchedKeypairException {
		addKeyPair(alia, pubKey, privKey, null);
	}

	/**
	 * 加入密钥；
	 * 
	 * @param algorithm
	 * @return
	 */
	void addKeyPair(String alia, PublicKey pubKey, PrivateKey privKey, PasswordSupplier passwordSupplier)
			throws MismatchedKeypairException;

}
